package com.Txunda.fxw.base.web;

import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;


import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import com.Txunda.fxw.base.utils.util.JSONUtils;
import com.Txunda.fxw.base.utils.util.MapUtils;

/**
 * API接口调用类
 * 
 * @author Zero @date 2014年12月10日
 * @version 1.0
 */
public class ApiTool {

	/** 默认的缓存超时时间 */
	private final int DEFULT_CURRENT_HTTP_CACHE_EXPIRY = 1000 * 1;

	/**
	 * 通过GET方式联网请求接口
	 * 
	 * @param url
	 * @param params
	 *            请求参数
	 * @param apiListener
	 *            回调监听
	 */
	public void getApi(String url, RequestParams params, final ApiListener apiListener) {
		HttpUtils httpUtils = new HttpUtils();
		// 设置缓存超时时间
		httpUtils.configCurrentHttpCacheExpiry(DEFULT_CURRENT_HTTP_CACHE_EXPIRY);
		httpUtils.send(HttpMethod.GET, url, params, new DefaultRequestCallBack(apiListener));
	}

	/**
	 * 通过POST方式联网请求接口
	 * 
	 * @param url
	 * @param params
	 * @param apiListener
	 */
	public void postApi(String url, RequestParams params, final ApiListener apiListener) {
		HttpUtils httpUtils = new HttpUtils();
		// 设置缓存超时时间
		httpUtils.configCurrentHttpCacheExpiry(DEFULT_CURRENT_HTTP_CACHE_EXPIRY);
		httpUtils.send(HttpMethod.POST, url, params, new DefaultRequestCallBack(apiListener));
	}

	/**
	 * 解析返回的error串
	 * 
	 * @param json
	 * @return Map<String,String>
	 */
	private Map<String, String> parseError(String json) {
		JSONObject jsonObject;
		if (json.startsWith("[") && json.endsWith("]")) {
			return null;
		}
		try {
			jsonObject = new JSONObject(json);
		} catch (JSONException e) {
			return null;
		}
		String flag = jsonObject.optString("flag");
		if (flag == null || !flag.equals("error"))
			return null;
		return JSONUtils.parseKeyAndValueToMap(json);
	}

	/**
	 * 默认HTTP请求回调
	 * 
	 * @author Zero @date 2014年12月10日
	 * @version 1.0
	 */
	private class DefaultRequestCallBack extends RequestCallBack<String> {

		private ApiListener apiListener;

		public DefaultRequestCallBack(ApiListener apiListener) {
			this.apiListener = apiListener;
		}

		@Override
		public void onStart() {
			try {
				apiListener.onStarted();
			} catch (NullPointerException e) {
				e.printStackTrace();
			}
			
		}

		@Override
		public void onCancelled() {
			try {
				apiListener.onCancelled();
			} catch (NullPointerException e) {
				e.printStackTrace();
			}
			
		}

		@Override
		public void onLoading(long total, long current, boolean isUploading) {
			try {
				apiListener.onLoading(total, current, isUploading);
			} catch (NullPointerException e) {
				e.printStackTrace();
			}
			
		}

		@Override
		public void onSuccess(ResponseInfo<String> responseInfo) {
			try {
				Map<String, String> map = parseError(responseInfo.result);
				if (MapUtils.isEmpty(map)) {
					apiListener.onComplete(getRequestUrl(), responseInfo.result);
				} else {
//					apiListener.onError(map);
					apiListener.onError(getRequestUrl(),map);
				}
			} catch (NullPointerException e) {
				e.printStackTrace();
				//apiListener.onException(e);
			}
		}

		@Override
		public void onFailure(HttpException error, String msg) {
			try {
				apiListener.onException(error);
			} catch (NullPointerException e) {
				e.printStackTrace();
			}
			
		}

	}

}
